<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Usuario_model extends CI_Model {

    /**
     * Funcion que regresa un objeto en caso de que existiera en la base de 
     * datos
     * @param String $usuario
     * @param String $pass
     * @return Object
     */
    public function verificar_datos($usuario, $pass) {
        $query = "select  te.te_tipo_empleado_id,
		te.te_nombre,
		e.e_empleado_id,
		e.e_nombre,
		e.e_usuario,
                e.e_email,                    
                d.d_division_id,
                d.d_nombre,
                em.e_empresa_id,
                em.e_nombre em_nombre,
                em.e_name_imagen
        
            from empleado e 
            join tipo_empleado te  on(te.te_tipo_empleado_id=e.te_tipo_empleado_id)
            join division d on( d.d_division_id = e.d_division_id)
            join empresa em on (em.e_empresa_id = d.e_empresa_id)
            where e.e_usuario= ? and e.e_pass= ?";
        $resultado = $this->db->query($query, array($usuario, $pass));
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Funcion que devuelve una lista de todos los modulos 
     * asociados a la empresa y la division a la que perteneceria el
     * estudiante
     * @param type $d_division_id
     * @return Array Object Modulos Correspondientes a la empresa 
     * y a la Division
     */
    public function getModulos($d_division_id) {
       $query = "select m.m_modulo_id,m.m_nombre from modulo m 
                JOIN sub_modulo sm on sm.m_modulo_id = m.m_modulo_id 
                where m.d_division_id = $d_division_id ";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Funcion que se encarga de regresar los submodulos de cada modulo
     * @param int $m_modulo_id
     * @return Array of objects 
     */
    public function getSubModulos($m_modulo_id) {
        $query = "SELECT sm_sub_modulo_id,sm_nombre FROM sub_modulo
                    WHERE m_modulo_id = $m_modulo_id";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Funcion que regresa un arreglo con los materiales asociados
     * a un submodulo
     * @param int $sm_sub_modulo_id
     * @return Array of objects
     */
    public function getMateriales($sm_sub_modulo_id) {
        $query = "select d.d_division_id,
                sm.m_modulo_id,
                sm.sm_sub_modulo_id,
                m_material_id,
                m_titulo,
                m_nombre_documento,
                m_nombre_en_disco,
                m_orden,
                m_descripcion
                from material m 
                join sub_modulo sm on sm.sm_sub_modulo_id = m.sm_sub_modulo_id
                join modulo mo on mo.m_modulo_id = sm.m_modulo_id
                JOIn division d on d.d_division_id = mo.d_division_id
                where m.sm_sub_modulo_id = $sm_sub_modulo_id
                order by m_orden";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Funcion que se encarga de obtener todas las preguntas correspondientes
     * a id del material de entrada
     * @param int $m_material_id
     * @return Array Object
     */
    public function getPreguntas($m_material_id) {
        $query = "SELECT p_pregunta_id,p_pregunta FROM pregunta where m_material_id = $m_material_id";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Funcion que se encarga de obtener la opciones de cada
     * una de las preguntas
     * @param int $p_pregunta_id Identificador de la pregunta
     * @return Array Object
     */
    public function getOpciones($p_pregunta_id) {
        $query = "select p_pregunta_id,o_matricula,o_opcion from opcion where p_pregunta_id = $p_pregunta_id";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Función que se encarga de insertar un curso dependiendo
     * del empleado y del material 
     * @param type $e_empleado_id
     * @param type $m_material_id
     */
    public function insertarCurso($e_empleado_id, $m_material_id) {
        $query = "insert into cursos_tomados 
                (e_empleado_id,m_material_id,ct_uacceso,ct_intentos) values 
                ($e_empleado_id,$m_material_id,now(),1)";
        $this->db->query($query);
    }

    public function getIDPreguntas($m_material_id) {
        $query = "SELECT p_pregunta_id FROM pregunta where 
                    m_material_id = $m_material_id";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Los usuarios solo podran tener almacenada la respuesta de su ultimo examen
     * si existe en la tabla se remplaza, si no se crea
     * @param int $e_empleado_id
     * @param int $p_pregunta_id
     * @param int $s_seleccionada
     */
    public function updateSeleccion($e_empleado_id, $p_pregunta_id, $s_seleccionada) {
        $query = "replace INTO seleccion 
                VALUES($e_empleado_id,$p_pregunta_id,$s_seleccionada)";
        $this->db->query($query);
    }

    /**
     * Funcion que se encarga de regresar el ultimo examen resulto por el usuario 
     * @param int $e_empleado_id
     * @return object
     */
    public function getUltimoCursoTomado($e_empleado_id) {
        $query = "select m_material_id from cursos_tomados
                where e_empleado_id = $e_empleado_id
                order by ct_uacceso desc limit 1";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Obtiene la calificacion del ultimo examen resulto por dicho empleado
     * @param int $e_empleado_id
     * @return object
     */
    public function getCalifiacion($e_empleado_id, $ultimoCT) {

        $query = "select 
	((select count(*) buenas from pregunta p 
	JOIN opcion o on (o.p_pregunta_id = p.p_pregunta_id)
	JOIN seleccion s on (s.p_pregunta_id = p.p_pregunta_id)
	WHERE p.m_material_id = $ultimoCT and o.o_correcto = TRUE and 
    o.o_matricula = s.s_seleccionada and s.e_empleado_id = $e_empleado_id) 
    / 
    (SELECT count(p.p_pregunta_id) Num_Preguntas FROM pregunta p where p.m_material_id = $ultimoCT )*10) calificacion";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Devuelve el valor minimo para aprobar un examen
     * @param type $m_material_id
     * @return type
     */
    public function getMinimo($m_material_id) {
        $query = "select m_minimo from material where m_material_id = $m_material_id; ";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Devuelve el numero de accesos a materiales que 
     * ha realizado dicho empleado
     * @param type $e_empleado_id
     * @return type
     */
    public function countAccess($e_empleado_id) {
        $query = "select count(e_empleado_id) conteo from cursos_tomados where e_empleado_id = $e_empleado_id;";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Devuelve el ID del primer material
     * que debe realizar un empleado en dicha division de 
     * dicha empresa
     * @param type $e_empresa_id
     * @param type $d_division_id
     * @return type
     */
    public function getFirstInList($e_empresa_id, $d_division_id) {
        $query = "SELECT ma.m_material_id  FROM empresa e 
                    JOIN division d on (d.d_division_id = e.e_empresa_id)
                    JOIN modulo m on (m.d_division_id = d.d_division_id)
                    JOIN sub_modulo sm on (sm.m_modulo_id = m.m_modulo_id)
                    JOIN material ma on (ma.sm_sub_modulo_id = sm.sm_sub_modulo_id)
                    WHERE e.e_empresa_id = $e_empresa_id and d.d_division_id = $d_division_id
                    order by m.m_modulo_id,sm.sm_sub_modulo_id,m_orden
                    limit 1";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Devuelve la lista completa de todos los ids de los materiales que le 
     * corresponden a dicha division(deonde esta ubicado el empleado)
     * @param type $d_division_id
     * @return type
     */
    public function getAllMateriales($d_division_id) {
        $query = "select m.m_material_id from division d 
                join modulo mo on mo.d_division_id = d.d_division_id
                JOIN sub_modulo sm on sm.m_modulo_id = mo.m_modulo_id
                JOIN material m on m.sm_sub_modulo_id = sm.sm_sub_modulo_id
                where d.d_division_id = $d_division_id
                order by mo.m_modulo_id,sm.sm_sub_modulo_id,m.m_orden";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Devulve el numeros de intentos sobre un material
     * @param type $m_material_id
     * @param type $e_empleado_id
     * @return type
     */
    public function getAttempts($m_material_id, $e_empleado_id) {
        $query = "select count(e_empleado_id) intentos from cursos_tomados
                where e_empleado_id = $e_empleado_id and m_material_id = $m_material_id";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Retorna el numero de examenes que faltan por realizar
     * @param type $e_empleado_id
     * @param type $d_division_id
     * @return Object testNoDone
     */
    public function getNumTestNoDone($e_empleado_id, $d_division_id) {
        $query = "select(
                        select count(m_material_id) as testTotal 
                        from division d
                        join modulo mo on mo.d_division_id = d.d_division_id
                        join sub_modulo sm on sm.m_modulo_id = mo.m_modulo_id
                        join material m on m.sm_sub_modulo_id = sm.sm_sub_modulo_id
                        where d.d_division_id = $d_division_id
                    )-(
                        select count(e_empleado_id) as testDone 
                        from cursos_tomados ct join material mt using (m_material_id)
                        where e_empleado_id = $e_empleado_id and mt.m_examen = 1
                ) as testNoDone";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Obtiene el´promedio por empleado
     * @param type $e_empleado_id
     * @return Object->avg
     */
    public function getAvgEmpleado($e_empleado_id) {
        $query = "select round(avg(x.prom),2) as avg from (
                    select round((count(*)/tp.total_preguntas)*10,2) as prom
                    from empresa e 
                    join division d on(e.e_empresa_id=d.e_empresa_id)
                    join empleado eo on(d.d_division_id=eo.d_division_id)
                    join seleccion s on(eo.e_empleado_id=s.e_empleado_id)
                    join pregunta p on(s.p_pregunta_id=p.p_pregunta_id)
                    join opcion o on(p.p_pregunta_id=o.p_pregunta_id)
                    join modulo m on(d.d_division_id=d.d_division_id)
                    join sub_modulo sm on(m.m_modulo_id=sm.m_modulo_id)
                    join material mt on(sm.sm_sub_modulo_id=mt.sm_sub_modulo_id and mt.m_material_id=p.m_material_id)
                    join (	
                            SELECT  p.m_material_id,
                                            count(*) total_preguntas 
                            FROM 	pregunta p 
                            group by p.m_material_id
                        ) tp on(tp.m_material_id=p.m_material_id)
                    where s.s_seleccionada=o.o_matricula 
                    and o.o_correcto and eo.e_empleado_id = $e_empleado_id
                    group by    e.e_empresa_id,
                                d.d_division_id,
                                m.m_modulo_id,
                                sm.sm_sub_modulo_id,
                                p.m_material_id,
                                eo.e_empleado_id
                ) as x";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    /**
     * Datos de los examenes realizados
     * @param type $e_empleado_id
     * @return Object
     */
    public function getListTestDone($e_empleado_id) {
        $query = "select m.m_nombre,
            sm.sm_nombre,
            mt.m_titulo,
            date_format(ct.ct_uacceso,'%Y-%m-%d') ct_uacceso,
            round((count(*)/tp.total_preguntas)*10,2) as prom
                    from empresa e 
                    join division d on(e.e_empresa_id=d.e_empresa_id)
                    join empleado eo on(d.d_division_id=eo.d_division_id)
                    join cursos_tomados ct on(ct.e_empleado_id = eo.e_empleado_id)
                    join seleccion s on(eo.e_empleado_id=s.e_empleado_id)
                    join pregunta p on(s.p_pregunta_id=p.p_pregunta_id)
                    join opcion o on(p.p_pregunta_id=o.p_pregunta_id)
                    join modulo m on(d.d_division_id=d.d_division_id)
                    join sub_modulo sm on(m.m_modulo_id=sm.m_modulo_id)
                    join material mt on(sm.sm_sub_modulo_id=mt.sm_sub_modulo_id and mt.m_material_id=p.m_material_id and ct.m_material_id=mt.m_material_id)
                    join (	
                            SELECT  p.m_material_id,
                                            count(*) total_preguntas 
                            FROM 	pregunta p 
                            group by p.m_material_id
                        ) tp on(tp.m_material_id=p.m_material_id)
                    where s.s_seleccionada=o.o_matricula 
                    and o.o_correcto and eo.e_empleado_id = $e_empleado_id
                    group by    e.e_empresa_id,
                                d.d_division_id,
                                m.m_modulo_id,
                                sm.sm_sub_modulo_id,
                                p.m_material_id,
                                eo.e_empleado_id";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }


    public function getDataTest($e_empleado_id,$m_material_id){
        $query = "select e_empleado_id,
                        m_material_id,
                        ct_uacceso,
                        ct_intentos
                    from cursos_tomados 
                    where 	m_material_id = $m_material_id and 
                                e_empleado_id = $e_empleado_id";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }
    
    public function updateIntentos($e_empleado_id,$m_material_id){
        $query = "UPDATE cursos_tomados SET ct_intentos = 2 WHERE e_empleado_id = $e_empleado_id and m_material_id = $m_material_id";
        $this->db->query($query);
    }


    /**
     * ----------------------------------------
     */
    public function getUsuarios() {
        $query = "select * from empleado limit 10000";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function getTestDiv($d_division_id) {
        $query = "select m.m_material_id from division d
join modulo mo on mo.d_division_id = d.d_division_id
JOIN sub_modulo sm on sm.m_modulo_id = mo.m_modulo_id
JOIN material m on m.sm_sub_modulo_id = sm.sm_sub_modulo_id
where d.d_division_id = $d_division_id
order by mo.m_modulo_id,sm.sm_sub_modulo_id,m.m_orden";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function getNumTextDiv($d_division_id) {
        $query = "select count(m.m_material_id) num from division d
join modulo mo on mo.d_division_id = d.d_division_id
JOIN sub_modulo sm on sm.m_modulo_id = mo.m_modulo_id
JOIN material m on m.sm_sub_modulo_id = sm.sm_sub_modulo_id
where d.d_division_id = $d_division_id
order by mo.m_modulo_id,sm.sm_sub_modulo_id,m.m_orden";
        $resultado = $this->db->query($query);
        $out = $resultado->row();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function getLIstaPreguntas($m_material_id) {
        $query = "select * from material m 
join pregunta p on p.m_material_id = m.m_material_id
where m.m_material_id = $m_material_id";
        $resultado = $this->db->query($query);
        $out = $resultado->result();
        $resultado->next_result();
        $resultado->free_result();
        return $out;
    }

    public function setSeleccion($e_empleado_id, $p_pregunta_id, $s_seleccionada) {
        $query = "insert into seleccion (e_empleado_id,p_pregunta_id,s_seleccionada) values ($e_empleado_id,$p_pregunta_id,$s_seleccionada);";
        $this->db->query($query);
    }

    public function setCT($e_empleado_id, $m_material_id, $fecha, $intentos) {
        $query = "insert into cursos_tomados (e_empleado_id,m_material_id,ct_uacceso,ct_intentos) values ($e_empleado_id,$m_material_id,'$fecha',$intentos)";
        $this->db->query($query);
    }

    /**
     * Consulta que se encarga de generar una tabla con los estados de todos 
     * los examenes que debe realizar el empleado, de aquellos que puede o
     * no puede realizar
     * Consideraciones:
     * Esta funcion se apoya de tres funciones que se encargan de regresar 
     * una cadena para formar la consulta completa con la finalidad de hacer mas 
     * comprensible el codigo.
     * 
     * @param int $e_empleado_id
     * @param int $count
     * @return Object
     */
    public function getSerializacion($e_empleado_id){        
        $count = $this->countTestDone($e_empleado_id)->conteo;
        $first = $this->firstUnion($e_empleado_id);
        $second = $this->secondUnion($e_empleado_id, $count);
        $third = $this->thirdUnion($e_empleado_id);
    
        $query = "($first)union($second)union($third)";
        
        $result = $this->db->query($query);
        $out = $result->result();
        $result->next_result();
        $result->free_result();
        return $out;
    }
    /**
     * Consulta dinamica que genera todos los examenes realizados por dicho
     * empleado y coloca un estatus a los examenes
     * Casos:
     * Si el examen tiene un solo intento y se encuentra reprobado, el examen
     * se debe permitir realizar
     * Si el examen tiene un intento y esta aprobado, debe ser bloqueado
     * Si el examen tiene dos intentos y esta reprobado o aprobado, debe ser bloqueado
     * 
     * @param int $e_empleado_id
     * @return string
     */
    public function firstUnion($e_empleado_id){
        $query = "select 		
		mt.m_material_id,
		ct.ct_intentos,
		m.m_nombre,
		sm.sm_nombre,
		mt.m_titulo,
		date_format(ct.ct_uacceso,'%Y-%m-%d') ct_uacceso,
		if(round((count(*)/tp.total_preguntas)*10,2) <= mt.m_minimo and ct.ct_intentos=1,'Permitir','Bloquear') estado,
		mt.m_minimo
	from empresa e 
		join division d on(e.e_empresa_id=d.e_empresa_id)
		join empleado eo on(d.d_division_id=eo.d_division_id)
		join cursos_tomados ct on(ct.e_empleado_id = eo.e_empleado_id)
		join seleccion s on(eo.e_empleado_id=s.e_empleado_id)
		join pregunta p on(s.p_pregunta_id=p.p_pregunta_id)
		join opcion o on(p.p_pregunta_id=o.p_pregunta_id)
		join modulo m on(d.d_division_id=d.d_division_id)
		join sub_modulo sm on(m.m_modulo_id=sm.m_modulo_id)
		join material mt on(sm.sm_sub_modulo_id=mt.sm_sub_modulo_id and mt.m_material_id=p.m_material_id and ct.m_material_id=mt.m_material_id)
		join (	
				SELECT  p.m_material_id,
								count(*) total_preguntas 
				FROM 	pregunta p 
				group by p.m_material_id
			) tp on(tp.m_material_id=p.m_material_id)
	where s.s_seleccionada=o.o_matricula 
	and o.o_correcto and eo.e_empleado_id = $e_empleado_id
	group by    
				d.d_division_id,
				m.m_modulo_id,
				sm.sm_sub_modulo_id,
				p.m_material_id
	order by 
		m.m_modulo_id,
		sm.sm_sub_modulo_id";
        return $query;
    }
    /**
     * Aqui se va a establecer el estado del examen que sigue en la 
     * serializacion de examenes en caso de que sea cero significa que no ha realizado 
     * ningun examen por lo que el primer examen por realizar se debe permitir
     * diferente de cero se debe obtener el ultimo que realizo y calcular el 
     * estatus para el siguiente examen con forme a las reglas de negocio establecidas
     * en la funcion de secondUnion()
     * @param int $count
     * @return string
     */
    public function statusNextTest($e_empleado_id,$count){
        if($count == 0 ){
            return "'Permitir'";
        }
        $inf = $count - 1;
        $sup = $count;
        return "select 		
				if(round((count(*)/tp.total_preguntas)*10,2) <= mt.m_minimo and ct.ct_intentos = 1,'Permitir','Bloquear') estado
			from empresa e 
				join division d on(e.e_empresa_id=d.e_empresa_id)
				join empleado eo on(d.d_division_id=eo.d_division_id)
				join cursos_tomados ct on(ct.e_empleado_id = eo.e_empleado_id)
				join seleccion s on(eo.e_empleado_id=s.e_empleado_id)
				join pregunta p on(s.p_pregunta_id=p.p_pregunta_id)
				join opcion o on(p.p_pregunta_id=o.p_pregunta_id)
				join modulo m on(d.d_division_id=d.d_division_id)
				join sub_modulo sm on(m.m_modulo_id=sm.m_modulo_id)
				join material mt on(sm.sm_sub_modulo_id=mt.sm_sub_modulo_id and mt.m_material_id=p.m_material_id and ct.m_material_id=mt.m_material_id)
				join (	
						SELECT  p.m_material_id,
										count(*) total_preguntas 
						FROM 	pregunta p 
						group by p.m_material_id
					) tp on(tp.m_material_id=p.m_material_id)
			where s.s_seleccionada=o.o_matricula 
			and o.o_correcto and eo.e_empleado_id = $e_empleado_id
			group by    
						d.d_division_id,
						m.m_modulo_id,
						sm.sm_sub_modulo_id,
						p.m_material_id
			order by 
				m.m_modulo_id ,
				sm.sm_sub_modulo_id ,
				mt.m_orden
			limit $inf,$sup";
    }
    
    
    /**
     * Seccion de la consulta que devuelve el ultimo examen secuencial 
     * realizado, el cual nos permitira establecer un status al siguiente examen
     * secuencial de empleado
     * REGAL DE NEGOCIO
     * 
     * Si el ultimo examen tiene un intento y esta reprobado el siguiente examen
     * debe encontrarse bloqueado.
     * 
     * Si el ultimo examen tiene dos intentos y se encuentra resprobado, este debe
     * bloquearse y el siguiente en la secuencia, se debe desbloquear
     * 
     * Si el ultimo examen tiene uno o dos intentos y lo aprobo, el siguiente 
     * examen en la secuencia debe ser permitido
     *  
     * @param type $e_empleado_id
     * @return string
     */
    
    public function secondUnion($e_empleado_id,$count){
        $status = $this->statusNextTest($e_empleado_id,$count);
        return  "select
		mt.m_material_id,
		0 ct_intentos,
		mo.m_nombre,
		sm.sm_nombre,
		mt.m_titulo,
		'--/--/--' ct_uacceso,
		(
                    $status
		) estado,
		mt.m_minimo
	from empleado eo
		join division d using (d_division_id)
		join modulo mo using (d_division_id) 
		join sub_modulo sm using (m_modulo_id)
		join material mt using (sm_sub_modulo_id)
	where 
		eo.e_empleado_id = $e_empleado_id and
		mt.m_examen and 
		mt.m_material_id NOT in 
		(
			select 
				mt.m_material_id
			from cursos_tomados ct
				join material mt using (m_material_id) 
			where ct.e_empleado_id = $e_empleado_id
		)
	order by 
		mo.m_modulo_id,
        sm.sm_sub_modulo_id
	limit 0,1";
    }
    /**
     * Realiza la union de los examenes faltantes por realizar y se les
     * establece el estatus de bloqueados ya que ninguno se a realizado
     * @param type $e_empleado_id
     */
    public function thirdUnion($e_empleado_id){
        return  "select 
		mt.m_material_id,
		0 ct_intentos,
		mo.m_nombre,
		sm.sm_nombre,
		mt.m_titulo,
		'--/--/--' ct_uacceso,
		'Bloquear' estado,
		mt.m_minimo
	from empleado eo
		join division d using (d_division_id)
		join modulo mo using (d_division_id) 
		join sub_modulo sm using (m_modulo_id)
		join material mt using (sm_sub_modulo_id)

	where 
		eo.e_empleado_id = $e_empleado_id and
		mt.m_examen and
		mt.m_material_id not in
		(
			select r.m_material_id from 
			(
				(
					select 		
						mt.m_material_id,
						ct.ct_intentos,
						m.m_nombre,
						sm.sm_nombre,
						mt.m_titulo,
						date_format(ct.ct_uacceso,'%Y-%m-%d') ct_uacceso,
						if(round((count(*)/tp.total_preguntas)*10,2) <= mt.m_minimo and ct.ct_intentos=1,'Permitir','Bloquear') estado,
						mt.m_minimo
					from empresa e 
						join division d on(e.e_empresa_id=d.e_empresa_id)
						join empleado eo on(d.d_division_id=eo.d_division_id)
						join cursos_tomados ct on(ct.e_empleado_id = eo.e_empleado_id)
						join seleccion s on(eo.e_empleado_id=s.e_empleado_id)
						join pregunta p on(s.p_pregunta_id=p.p_pregunta_id)
						join opcion o on(p.p_pregunta_id=o.p_pregunta_id)
						join modulo m on(d.d_division_id=d.d_division_id)
						join sub_modulo sm on(m.m_modulo_id=sm.m_modulo_id)
						join material mt on(sm.sm_sub_modulo_id=mt.sm_sub_modulo_id and mt.m_material_id=p.m_material_id and ct.m_material_id=mt.m_material_id)
						join (	
								SELECT  p.m_material_id,
												count(*) total_preguntas 
								FROM 	pregunta p 
								group by p.m_material_id
							) tp on(tp.m_material_id=p.m_material_id)
					where s.s_seleccionada=o.o_matricula 
					and o.o_correcto and eo.e_empleado_id = $e_empleado_id
					group by    
								d.d_division_id,
								m.m_modulo_id,
								sm.sm_sub_modulo_id,
								p.m_material_id
					order by 
						m.m_modulo_id,
						sm.sm_sub_modulo_id
				)
				union
				(
					select
						mt.m_material_id,
						0 ct_intentos,
						mo.m_nombre,
						sm.sm_nombre,
						mt.m_titulo,
						'--/--/--' ct_uacceso,
						'Permitir' estado,
						mt.m_minimo
					from empleado eo
						join division d using (d_division_id)
						join modulo mo using (d_division_id) 
						join sub_modulo sm using (m_modulo_id)
						join material mt using (sm_sub_modulo_id)
					where 
						eo.e_empleado_id = $e_empleado_id and
						mt.m_examen and 
						mt.m_material_id NOT in 
						(
							select 
								mt.m_material_id
							from cursos_tomados ct
								join material mt using (m_material_id) 
							where ct.e_empleado_id = $e_empleado_id
						)
					order by 
						mo.m_modulo_id,
						sm.sm_sub_modulo_id
					limit 0,1
				)
			) as r
		)";
    }
    
    public function countTestDone($e_empleado_id){
        $query = "select count(*) conteo 
            from cursos_tomados
            JOIN material mt using(m_material_id)
             where e_empleado_id = $e_empleado_id and mt.m_examen = 1";
        $result = $this->db->query($query);        
        $out = $result->row();
        $result->next_result();
        $result->free_result();
        return $out;
    }
    
    public function getDataDoc($m_nombre_en_disco){
        $query = "select tm.tm_extension,
		mt.m_titulo
                from material mt 
                join tipo_material tm using (tm_tipo_material_id)
                where mt.m_nombre_en_disco = '$m_nombre_en_disco'";
        $result = $this->db->query($query);        
        $out = $result->row();
        $result->next_result();
        $result->free_result();
        return $out;
        
    }
    /**
     * 
     * @param type $captcha_time
     * @param type $ip_address
     * @param type $word
     */
    function insertCaptcha($captcha_time, $ip_address, $word) {
        $query = "insert into captcha(captcha_id,captcha_time,ip_address,word)
                values(NULL,?,?,?)";
        $this->db->query($query, array($captcha_time, $ip_address, $word));
    }

    /**
     * 
     * @param type $ip_address
     */
    function deleteCaptcha($ip_address) {
        $this->db->query("delete from captcha where ip_address = '$ip_address'");
    }

    /**
     * 
     * @param type $binds
     * @return boolean
     */
    function captchaExist($binds) {
        $sql = "select count(*) as count from captcha where word = ? and ip_address = ? and captcha_time > ?";
        $query = $this->db->query($sql, $binds);
        $row = $query->row();

        if ($row->count == 0)
            return FALSE;
        else
            return TRUE;
    }
    
    /**
    * 
    * @param type $l_ip
    * @param type $l_nombre
    */
    public function regAcceso($l_ip,$l_nombre){
        $query = "insert into log_accesos(l_nombre,l_fecha,l_hora,l_ip) values (?,date(NOW()),time(NOW()),?)";
        $this->db->query($query, array($l_nombre, $l_ip));
    }
            
}
